/*
* 基于下面提供的代码，完成后续的四个练习
* class Container {
    static of(value) {
        return new Container(value)
    }
    constructor(value) {
        this._value = value
    }
    map(fn) {
        return Container.of(fn(this._value))
    }
}

class Maybe {
    static of(value) {
        return new Maybe(value)
    }

    constructor(value) {
        this._value = value
    }

    isNothing() {
        return this._value === null || this._value === undefined
    }

    map(fn) {
        return this.isNothing() ? this : Maybe.of(fn(this._value))
    }
}

module.exports = {Maybe, Container}
* */

/*
* 练习1：使用fp.add(x,y)和fp.map(f,x)创建一个能让functor里的值增加的函数ex1
* */
const fp = require('lodash/fp')
const {Maybe, Container} = require('./support')
let maybe = Maybe.of([5, 6, 1])

let ex1 = () => {
    return maybe.map(arr => fp.map(item => fp.add(item, 1), arr))
}
console.log('ex1()-->', ex1())

/*
* 练习2：实现一个函数ex2，能够使用fp.first获取列表的第一个元素
* */
let xs = Container.of(['do', 'ray', 'me', 'fa', 'so', 'la', 'ti', 'do'])
let ex2 = () => {
    return xs.map(fp.first)._value
}
console.log('ex2()-->', ex2())

/*
* 练习3：实现一个函数ex3，使用safeProp和fp.first找到user的名字的首字母
* */
let safeProp = fp.curry(function (x, o) {
    return Maybe.of(o[x])
})
// safeProp返回函子
let user = {id: 2, name: 'Albert'}
let ex3 = () => {
    return safeProp('name', user).map(v => fp.first(v))
}
console.log('ex3()-->', ex3())

/*
* 练习4：使用Maybe重写ex4，不要有if语句
* */
let ex4 = function (n) {
    if (n) {
        return parseInt(n)
    }
}

let myEx4 = function (n) {
    return Maybe.of(n)
        .map(n => parseInt(n))
}
console.log('myEx4-->', myEx4(5))
